package cn.com.bod.fas.common.utils;

import cn.com.bod.fas.common.constant.enumconst.ResultCodeEnum;
import cn.com.bod.fas.common.constant.enumconst.SequenceCodeEnum;
import cn.com.bod.fas.common.exception.BaseException;
import cn.com.bod.fas.common.service.FeignSequenceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @description 主键序列获取工具类
 * @author zhangchi
 * @date 2019年9月27日 17:19:27
 * @version 1.0.0
 * @Copyright (c) scfhdt
 */
@Component
public class SequenceUtil {

    @Autowired
    private FeignSequenceService feignSequenceService;

    /**
     * @description 获取一个模板编号
     * @author zhangchi
     * @date 2019年9月29日 14:29:55
     * @param codeEnum 模板定义枚举
     * @return java.lang.String
     */
    public String getTempSeqByCode(SequenceCodeEnum codeEnum) {
        String result = feignSequenceService.getTempSequenceByCode(codeEnum.getCode());
        if ("errorCode".equals(result)) {
            throw new BaseException(ResultCodeEnum.NOT_EXIST_SEQ_CODE);
        }
        return result;
    }

    /**
     * @description 获取多个模板编号
     * @author zhangchi
     * @date 2019年9月29日 14:30:07
     * @param codeEnum 模板定义枚举
     * @param count 数量
     * @return java.util.List<java.lang.String>
     */
    public List<String> getTempSeqByCodeAndCount(SequenceCodeEnum codeEnum, Integer count) {
        return feignSequenceService.getTempSequenceByCodeAndCount(codeEnum.getCode(), count);
    }

    /**
     * @description 获取下个序列
     * @author zhangchi
     * @date 2019年9月29日 14:30:48
     * @param codeEnum 模板定义枚举
     * @return java.lang.Integer
     */
    public Integer getNextSeq(SequenceCodeEnum codeEnum) {
        String result = feignSequenceService.getNextSequence(codeEnum.getCode());
        if ("errorCode".equals(result)) {
            throw new BaseException(ResultCodeEnum.NOT_EXIST_SEQ_CODE);
        }
        return Integer.valueOf(result);
    }

    /**
     * @description 获取多个序列值
     * @author zhangchi
     * @date 2019年9月29日 14:31:05
     * @param codeEnum 模板定义枚举
     * @param count 数量
     * @return java.util.List<java.lang.Integer>
     */
    public List<Integer> getSeqByCount(SequenceCodeEnum codeEnum, Integer count) {
         List<Integer> list = feignSequenceService.getNextSequenceByCount(codeEnum.getCode(), count)
                .stream().map(item -> {return Integer.valueOf(item);}).collect(Collectors.toList());
        return list;
    }

}
